package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;

public class GreenDaoCreater {
    public static void main(String[] args) throws Exception {
        GreenDaoCreater dao = new GreenDaoCreater();
        dao.schema();
    }

    public void schema() {
        /** 正如你所见的，你创建了一个用于添加实体（Entity）的模式（Schema）对象。
         *  两个参数分别代表：数据库版本号与自动生成代码的包路径。
         *  Schema schema = new Schema(1, "com.example.greendao");
         *  当然，如果你愿意，你也可以分别指定生成的 Bean 与 DAO 类所在的目录，只要如下所示
         */

        Schema schema = new Schema(1, "com.example.sunsg.okhttptest.greendao.bean");
        schema.setDefaultJavaPackageDao("com.example.sunsg.okhttptest.greendao.dao");
        schema.enableActiveEntitiesByDefault();
        schema.enableKeepSectionsByDefault();

        /** 模式（Schema）同时也拥有两个默认的 flags，分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
         *  schema2.enableActiveEntitiesByDefault();
         *  schema2.enableKeepSectionsByDefault();
         */

        // 一旦你拥有了一个 Schema 对象后，你便可以使用它添加实体（Entities）了

//        oneToOne(schema);
        oneToMany(schema);
        manyToMany(schema);
        addPlayMusicCollection(schema);
        create(schema);
    }

    /**
     * 一对一
     *
     * @param schema
     */
    private void oneToOne(Schema schema) {
        //学生
        Entity student = schema.addEntity("Student");
        student.addLongProperty("studentId").primaryKey().autoincrement().getProperty();
        student.addStringProperty("name");
        student.addIntProperty("age");
        student.addDateProperty("date");

        //课程
        Entity course = schema.addEntity("Course");
        course.addLongProperty("courseId").primaryKey().autoincrement().getProperty();
        course.addStringProperty("name");
        course.addIntProperty("hours");
        course.addDateProperty("date");

        //student 添加 course
        Property propertyStudent = student.addLongProperty("courseId").getProperty();
        student.addToOne(course, propertyStudent);

        //course 添加 student
        Property propertyCourse = course.addLongProperty("studentId").getProperty();
        course.addToOne(student, propertyCourse);
    }

    /**
     * 一对多
     *
     * @param schema
     */
    private void oneToMany(Schema schema) {
        //顾客
        Entity customer = schema.addEntity("Customer");
        customer.addLongProperty("customerId").primaryKey().autoincrement().getProperty();
        customer.addStringProperty("name");
        customer.addIntProperty("age");
        customer.addDateProperty("date");

        //订单
        Entity order = schema.addEntity("Order");
        order.addLongProperty("orderId").primaryKey().autoincrement().getProperty();
        order.addStringProperty("name");
        order.addIntProperty("money");
        order.addDateProperty("date");

        //一个顾客有多个订单
        Property propertyCourse = order.addLongProperty("customerId").getProperty();
        order.addToOne(customer, propertyCourse);

        customer.addToMany(order, propertyCourse).setName("orders");

    }

    /**
     * 多对多
     *
     * @param schema
     */
    private void manyToMany(Schema schema) {
        //学生
        Entity student = schema.addEntity("Student");
        student.addLongProperty("studentId").primaryKey().autoincrement().getProperty();
        student.addStringProperty("name");
        student.addIntProperty("age");
        student.addDateProperty("date");

        //课程
        Entity course = schema.addEntity("Course");
        course.addLongProperty("courseId").primaryKey().autoincrement().getProperty();
        course.addStringProperty("name");
        course.addIntProperty("hours");
        course.addDateProperty("date");

        //学生课程表
        Entity studentCourse = schema.addEntity("StudentCourse");
        studentCourse.addIdProperty();

        Property propertyStudent = studentCourse.addLongProperty("studentId").getProperty();
        studentCourse.addToOne(student, propertyStudent);
        student.addToMany(studentCourse, propertyStudent);

        Property propertyCourse = studentCourse.addLongProperty("courseId").getProperty();
        studentCourse.addToOne(course, propertyCourse);
        course.addToMany(studentCourse, propertyCourse);
    }


    /**
     * 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码，此处你需要根据自己的情况更改输出目录（既之前创建的 java-gen)。
     * 其实，输出目录的路径可以在 build.gradle 中设置，有兴趣的朋友可以自行搜索，这里就不再详解。
     * "../app/src/main/java-gen"
     *
     * @param schema
     */
    private void create(Schema schema) {
        try {
            new DaoGenerator().generateAll(schema, "./app/src/main/java");
//            new DaoGenerator().generateAll(schema, "E:\\git\\RefreshRecyclerView\\app\\src\\main\\java-gen2");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 点播收藏
     * @param schema
     */
    private static void addPlayMusicCollection(Schema schema){
        Entity playMusic = schema.addEntity("PlayMusicCollection");
        playMusic.addLongProperty("playId").primaryKey().autoincrement().getProperty();
        playMusic.addIntProperty("id");
        playMusic.addIntProperty("pid");
        playMusic.addStringProperty("act");
        playMusic.addStringProperty("title");
        playMusic.addStringProperty("description");
        playMusic.addStringProperty("thumb");
        playMusic.addStringProperty("url");
        playMusic.addStringProperty("playType");
        playMusic.addBooleanProperty("avaiable");


    }

    /**
     * @param schema
     */
    private static void addNote(Schema schema) {
        // 1.一个实体（类）就关联到数据库中的一张表，此处表名为「Note」（既类名）
        Entity note = schema.addEntity("Note");
        // 你也可以重新给表命名
        // note.setTableName("NODE");

        // greenDAO 会自动根据实体类的属性值来创建表字段，并赋予默认值
        // 接下来你便可以设置表中的字段：
        note.addIdProperty();//2.最好不要这样设置主键 建立 一对多 和多对多时 主键和外键有可能一样
        note.addStringProperty("text").notNull();
        // 与在 Java 中使用驼峰命名法不同，默认数据库中的命名是使用大写和下划线来分割单词的。
        // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
        note.addStringProperty("comment");
        note.addDateProperty("date");
        note.addStringProperty("title");

        Entity student = schema.addEntity("Student");
        //3.一对一关系  Note 中有个Student
        Property oneNotePo = note.addLongProperty("studentId").getProperty();
        note.addToOne(student, oneNotePo);

        //添加student
        //添加并获得该主键属性 最好每个类都这样设置主键
        student.addLongProperty("studentId").primaryKey().autoincrement().getProperty();
        student.addStringProperty("text").notNull();
        // 与在 Java 中使用驼峰命名法不同，默认数据库中的命名是使用大写和下划线来分割单词的。
        // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
        student.addStringProperty("comment");
        student.addDateProperty("date");

        //一对一关系   Student 中有个 Note
        Property studioPro = student.addLongProperty("id").getProperty();
        student.addToOne(note, studioPro);
        //4.一对多关系 一个note有多个student
        note.addToMany(student, studioPro).setName("students");
    }
}
